#include "xml.h"
#include <QMessageBox>

xml::xml()
{
}

QList<QStringList> xml::LireRechercheFilm(QByteArray donnees)
{
    QList<QStringList> listeFilms;
    QStringList unFilm;
    QDomNode noeud, noeudFilm, noeudCasting;

    // Parse le doc xml et crée l'arborescence (vide le doc avant)
    if (!this->doc.setContent(donnees))
    {
        return listeFilms;
    }
    else
    {
        // Définit la racine
        this->racine = doc.documentElement();
        // Se place sur le premier élément "movie"
        noeud = racine.firstChild().nextSiblingElement("movie");
        while (!noeud.isNull())
        {
            // Ajoute le code du film
            unFilm << noeud.toElement().attribute("code");

            // Crée l'élément enfant film et se place sur le titre et l'ajoute
            noeudFilm = noeud.firstChild();
            unFilm << noeudFilm.toElement().text();
            // Se place sur l'année et l'ajoute
            noeudFilm = noeudFilm.nextSiblingElement("productionYear");
            unFilm << noeudFilm.toElement().text();
            // Se place sur les acteurs principaux et les ajoute
            noeudCasting = noeudFilm.nextSiblingElement("castingShort").firstChild();
            if (noeudCasting.toElement().tagName() != "actors")
                noeudCasting = noeudCasting.nextSiblingElement("actors");
            unFilm << noeudCasting.toElement().text();
            // Se place sur l'url de la pochette et l'ajoute
            noeudFilm = noeudFilm.nextSiblingElement("poster");
            unFilm << noeudFilm.toElement().attribute("href");
            // Ajoute le film à la liste de vides et vide le film
            listeFilms << unFilm;
            unFilm.clear();

            // Se place sur le prochain élément "movie"
            noeud = noeud.nextSiblingElement("movie");
        }

        /*QString texte;
        for (int i=0;i<listeFilms.count();i++)
        {
            for(int j=0;j<listeFilms.at(i).count();j++)
            {
                texte = texte.append(" " + listeFilms.at(i).at(j));
            }
        }
        QMessageBox msg(QMessageBox::Information,"titre",texte);
        msg.exec();*/

        return listeFilms;
    }
}

void xml::LireInfoFilm(film *unFilm, QByteArray donnees)
{
    QDomNode noeud;
    QDomNodeList listeNoeuds, listeNoeudsEnfant;
    personne pers;
    nationalite nat;
    genre genreFilm;
    QList<personne> listeRealisateurs, listeActeurs;
    QList<genre> listeGenres;
    QList<nationalite> listeNationalites;

    // Parse le doc xml et crée l'arborescence (vide le doc avant)
    if (!this->doc.setContent(donnees))
    {
        return;
    }
    else
    {
        // Définit la racine (élément movie)
        this->racine = doc.documentElement();
        unFilm->setCodeAllocine(racine.toElement().attribute("code").toInt());
        // Se place sur le premier élément        
        noeud = racine.firstChild();        

        while (!noeud.isNull())
        {
            // S'il s'agit du type de film (long métrage, ...)
            if (noeud.toElement().tagName() == "movieType")
            {
                unFilm->setType(noeud.toElement().text());
            }
            // S'il s'agit du titre original (si existant est avant titre)
            else if (noeud.toElement().tagName() == "originalTitle")
            {
                unFilm->setTitreOriginal(noeud.toElement().text());
            }
            // S'il s'agit du titre (si existant est après titre original)
            else if (noeud.toElement().tagName() == "title")
            {
                unFilm->setTitre(noeud.toElement().text());
            }
            // S'il s'agit de l'année
            else if (noeud.toElement().tagName() == "productionYear")
            {
                unFilm->setDate(noeud.toElement().text());
            }
            // S'il s'agit des nationalités
            else if (noeud.toElement().tagName() == "nationalityList")
            {
                // On récupère la liste des éléments nationalités
                listeNoeuds = noeud.childNodes();
                // On ajoute les nationalités
                for (int i = 0; i<listeNoeuds.count(); i++)
                {
                    nat.setNom(listeNoeuds.at(i).toElement().text());
                    nat.setCodeAllocine(listeNoeuds.at(i).toElement().attribute("code").toInt());
                    listeNationalites << nat;
                }
                unFilm->setListeNationalites(listeNationalites);
            }
            // S'il s'agit des genres
            else if (noeud.toElement().tagName() == "genreList")
            {
                // On récupère la liste des éléments genres
                listeNoeuds = noeud.childNodes();
                // On ajoute les genres
                for (int i = 0; i<listeNoeuds.count(); i++)
                {
                    genreFilm.setNom(listeNoeuds.at(i).toElement().text());
                    genreFilm.setCodeAllocine(listeNoeuds.at(i).toElement().attribute("code").toInt());
                    listeGenres << genreFilm;
                }
                unFilm->setListeGenres(listeGenres);
            }
            // S'il s'agit de la durée
            else if (noeud.toElement().tagName() == "runtime")
            {
                unFilm->setDuree(noeud.toElement().text().toInt());
            }
            // S'il s'agit du synopsis
            else if (noeud.toElement().tagName() == "synopsis")
            {
                unFilm->setSynopsis(noeud.toElement().text());
            }
            // S'il s'agit de l'affiche
            else if (noeud.toElement().tagName() == "poster")
            {
                unFilm->setAffiche(noeud.toElement().attribute("href"));
            }
            // S'il s'agit de la bande annonce
            else if (noeud.toElement().tagName() == "trailer")
            {
                unFilm->setCodeAllocineBandeAnnonce(noeud.toElement().attribute("code").toInt());
            }
            // S'il s'agit du casting
            else if (noeud.toElement().tagName() == "casting")
            {
                listeNoeuds = noeud.childNodes();
                // Pour chaque personne
                for (int i=0; i<listeNoeuds.count(); i++)
                {
                    listeNoeudsEnfant = listeNoeuds.at(i).childNodes();
                    // On vide les infos de l'objet personne
                    pers.Vider();
                    // On remplie les infos
                    for (int j=0; j<listeNoeudsEnfant.count(); j++)
                    {
                        if (listeNoeudsEnfant.at(j).toElement().tagName() == "person")
                        {
                            pers.setCodeAllocine(listeNoeudsEnfant.at(j).toElement().attribute("code").toInt());
                            for (int k=0; k<listeNoeudsEnfant.at(j).childNodes().count(); k++)
                            {
                                if (listeNoeudsEnfant.at(j).childNodes().at(k).toElement().tagName() == "name")
                                        pers.setNom(listeNoeudsEnfant.at(j).childNodes().at(k).toElement().text());
                            }
                        }
                        // On l'ajoute à la liste des réalisateurs ou des acteurs selon le code activity
                        if (listeNoeudsEnfant.at(j).toElement().tagName() == "activity")
                        {
                            if (listeNoeudsEnfant.at(j).toElement().attribute("code") == QString::number(personne::CODE_ACTEUR))
                                listeActeurs << pers;
                            else if (listeNoeudsEnfant.at(j).toElement().attribute("code") == QString::number(personne::CODE_REALISATEUR))
                                listeRealisateurs << pers;
                        }
                    }
                }
                unFilm->setListeActeurs(listeActeurs);
                unFilm->setListeRealisateurs(listeRealisateurs);
            }
            // S'il s'agit des notes (dans l'élément renfermant les statistiques)
            else if (noeud.toElement().tagName() == "statistics")
            {
                listeNoeuds = noeud.childNodes();
                for (int i=0; i<listeNoeuds.count(); i++)
                {
                    // S'il s'agit de la note de la presse
                    if (listeNoeuds.at(i).toElement().tagName() == "pressRating")
                    {
                        unFilm->setNotePresse(listeNoeuds.at(i).toElement().text().toFloat());
                    }
                    // S'il s'agit de la note des utilisateurs
                    else if (listeNoeuds.at(i).toElement().tagName() == "userRating")
                    {
                        unFilm->setNoteAllocine(listeNoeuds.at(i).toElement().text().toFloat());
                    }
                }
            }
            noeud = noeud.nextSibling();
        }

        return;
    }
}

void xml::LireInfoPersonne(personne *unePersonne, QByteArray donnees)
{
    nationalite nat;
    QList<nationalite> listeNat;
    QDomNode noeud, noeudEnfant;
    QDomNodeList listeNoeuds;

    // Parse le doc xml et crée l'arborescence (vide le doc avant)
    if (!this->doc.setContent(donnees))
    {
        return;
    }
    else
    {
        // Définit la racine
        this->racine = doc.documentElement();
        unePersonne->setCodeAllocine(racine.attribute("code").toInt());
        // Se place sur le premier élément
        noeud = racine.firstChild();

        while (!noeud.isNull())
        {
            // S'il s'agit du nom
            if(noeud.toElement().tagName() == "name")
            {
                QString nom = noeud.toElement().attribute("given");
                nom.append(" "+noeud.toElement().attribute("family"));
                unePersonne->setNom(nom);
            }
            // S'il s'agit du sexe
            else if (noeud.toElement().tagName() == "gender")
            {
                unePersonne->setSexe(noeud.toElement().text().toInt());
            }
            // S'il s'agit des nationalités
            else if (noeud.toElement().tagName() == "nationalityList")
            {
                listeNoeuds = noeud.childNodes();
                for (int i=0; i< listeNoeuds.count();i++)
                {
                    nat.setNom(listeNoeuds.at(i).toElement().text());
                    nat.setCodeAllocine(listeNoeuds.at(i).toElement().attribute("code").toInt());
                    listeNat << nat;
                }
                unePersonne->setListeNationalite(listeNat);
            }
            // S'il s'agit de la biographie
            else if (noeud.toElement().tagName() == "biography")
            {
                unePersonne->setBiographie(noeud.toElement().text());
            }
            // S'il s'agit de la date de naissance
            else if (noeud.toElement().tagName() == "birthDate")
            {
                unePersonne->setDateNaissance(noeud.toElement().text());
            }
            // S'il s'agit du lieu de naissance
            else if (noeud.toElement().tagName() == "birthPlace")
            {
                unePersonne->setLieuNaissance(noeud.toElement().text());
            }
            // S'il s'agit de la photo
            else if (noeud.toElement().tagName() == "picture")
            {
                unePersonne->setCheminPhoto(noeud.toElement().attribute("href"));
            }

            noeud = noeud.nextSibling();
        }
    }
    return;
}
